package com.tjetc._6inner_class;

import java.util.ArrayList;
import java.util.List;

class A {
    public static void main(String[] args) {
        _5StaticInnerClass.A a = new _5StaticInnerClass.A();
        a.f();

        _5StaticInnerClass staticInnerClass = new _5StaticInnerClass();
        _5StaticInnerClass.A a1 = staticInnerClass.getInstance1();
        a1.f();


        _5StaticInnerClass.A a2 = _5StaticInnerClass.getInstance();
        a2.f();
        a2.f1();
    }
}


public class _5StaticInnerClass {
    public static void main(String[] args) {
        /*
            静态内部类是定义在外部类的成员位置，并且有static修饰
            1. 可以直接访问外部类的所有静态成员，包含私有的，但不能直接访问非静态成员
            2. 可以添加任意访向修饰符(public、protected、默认、private),因为它的地位就是一个成员。
            3. 作用域：同其他的成员，为整个类体
            4. 静态内部类---访问---->外部类(比如：静态属性)（访问方式：直接访问所有静态成员）
            5. 外部类---访问------>静态内部类（访问方式：创建对象，再访问）
            6. 外部其他类---访问----->静态内部类
            7. 如果外部类和静态内部类的成员重名时，静态内部类访问的时候，默认遵循就近原则，如果想访问外部类的成员，则可以使用(外部类名.成员)去访问
         */
        _5StaticInnerClass.A a = new _5StaticInnerClass.A();
        a.f();

        _5StaticInnerClass staticInnerClass = new _5StaticInnerClass();
        A a1 = staticInnerClass.getInstance1();
        a1.f();


        _5StaticInnerClass.A a2 = _5StaticInnerClass.getInstance();
        a2.f();


    }

    int b = 1;
    static int c = 1;
    static int a = 2;
    public static A getInstance() {
        return new A();
    }


    public A getInstance1(){
        return new A();
    }


//    private static class A {
    public static class A {
        // 类的五大成员
        int a = 1;
        void f(){}
        A(){}
        {}
        class B{}

        void f1() {
//            System.out.println(b);
            System.out.println(c);
            // 由于静态成员中没有this所以使用 _5StaticInnerClass.a
            System.out.println(_5StaticInnerClass.a);
        }


    }
}
